home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 60 / IOPROG_60.ISO / soft / c++ / gsl-1.1.1-setup.exe / {app} / src / cheb / test.c < prev   
Encoding:
C/C++ Source or Header  |  2002-04-18  |  4.7 KB  |  152 lines

  1. /* cheb/test.c
  2.  * 
  3.  * Copyright (C) 1996, 1997, 1998, 1999, 2000 Gerard Jungman
  4.  * 
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or (at
  8.  * your option) any later version.
  9.  * 
  10.  * This program is distributed in the hope that it will be useful, but
  11.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * General Public License for more details.
  14.  * 
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19.  
  20. #include <config.h>
  21. #include <stdlib.h>
  22. #include <gsl/gsl_math.h>
  23. #include <gsl/gsl_errno.h>
  24. #include <gsl/gsl_test.h>
  25. #include <gsl/gsl_ieee_utils.h>
  26. #include <gsl/gsl_chebyshev.h>
  27.  
  28. double f_sin (double x, void * p) {
  29.   p = 0;
  30.   return sin(x);
  31. }
  32.  
  33. int 
  34. main(void)
  35. {
  36.   double tol = 100.0 * GSL_DBL_EPSILON;
  37.   double x;
  38.  
  39.   gsl_cheb_series * cs = gsl_cheb_alloc(40);
  40.   gsl_cheb_series * csd = gsl_cheb_alloc(40);
  41.   gsl_cheb_series * csi = gsl_cheb_alloc(40);
  42.  
  43.   gsl_function F_sin;
  44.  
  45.   F_sin.function = f_sin;
  46.   F_sin.params = 0;
  47.  
  48.   gsl_ieee_env_setup();
  49.  
  50.   gsl_cheb_init(cs, &F_sin, -M_PI, M_PI);
  51.  
  52.   for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
  53.     double r = gsl_cheb_eval(cs, x);
  54.     gsl_test_abs(r, sin(x), tol, "gsl_cheb_eval, sin(%.3g)", x);
  55.   }
  56.   
  57.   for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
  58.     double r, e;
  59.     gsl_cheb_eval_err(cs, x, &r, &e);
  60.     gsl_test_abs(r, sin(x), tol, "gsl_cheb_eval_err, sin(%.3g)", x);
  61.     gsl_test_factor(fabs(r-sin(x)) + GSL_DBL_EPSILON, e, 10.0, 
  62.                     "gsl_cheb_eval_err, error sin(%.3g)", x);
  63.   }
  64.  
  65.   for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
  66.     double r = gsl_cheb_eval_n(cs, 25, x);
  67.     gsl_test_abs(r, sin(x), tol, "gsl_cheb_eval_n, sin(%.3g)", x);
  68.   }
  69.  
  70.   for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
  71.     double r, e;
  72.     gsl_cheb_eval_n_err(cs, 25, x, &r, &e);
  73.     gsl_test_abs(r, sin(x), 100.0 * tol, "gsl_cheb_eval_n_err, deriv sin(%.3g)", x);
  74.     gsl_test_factor(fabs(r-sin(x)) + GSL_DBL_EPSILON, e, 10.0, 
  75.                     "gsl_cheb_eval_n_err, error sin(%.3g)", x);
  76.   }
  77.  
  78.   /* Test derivative */
  79.  
  80.   gsl_cheb_calc_deriv(csd, cs);
  81.  
  82.   for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
  83.     double r = gsl_cheb_eval(csd, x);
  84.     gsl_test_abs(r, cos(x), 1600 * tol, "gsl_cheb_eval, deriv sin(%.3g)", x);
  85.   }
  86.   
  87. #ifdef TEST_DERIVATIVE_ERR
  88.   for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
  89.     double r, e;
  90.     gsl_cheb_eval_err(csd, x, &r, &e);
  91.     gsl_test_abs(r, cos(x), tol, "gsl_cheb_eval_err, deriv sin(%.3g)", x);
  92.     gsl_test_factor(fabs(r-cos(x)) + GSL_DBL_EPSILON, e, 10.0, 
  93.                     "gsl_cheb_eval_err, deriv error sin(%.3g)", x);
  94.   }
  95. #endif
  96.  
  97.   for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
  98.     double r = gsl_cheb_eval_n(csd, 25, x);
  99.     gsl_test_abs(r, cos(x), 1600 * tol, "gsl_cheb_eval_n, deriv sin(%.3g)", x);
  100.   }
  101.  
  102. #ifdef TEST_DERIVATIVE_ERR
  103.   for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
  104.     double r, e;
  105.     gsl_cheb_eval_n_err(csd, 25, x, &r, &e);
  106.     gsl_test_abs(r, cos(x), 100.0 * tol, "gsl_cheb_eval_n_err, deriv sin(%.3g)", x);
  107.     gsl_test_factor(fabs(r-cos(x)) + GSL_DBL_EPSILON, e, 10.0, 
  108.                     "gsl_cheb_eval_n_err, deriv error sin(%.3g)", x);
  109.   }
  110. #endif
  111.  
  112.   /* Test integral */
  113.  
  114.   gsl_cheb_calc_integ(csi, cs);
  115.  
  116.   for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
  117.     double r = gsl_cheb_eval(csi, x);
  118.     gsl_test_abs(r, -(1+cos(x)), tol, "gsl_cheb_eval, integ sin(%.3g)", x);
  119.   }
  120.   
  121. #ifdef TEST_INTEGRAL_ERR
  122.   for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
  123.     double r, e;
  124.     gsl_cheb_eval_err(csi, x, &r, &e);
  125.     gsl_test_abs(r, -(1+cos(x)), tol, "gsl_cheb_eval_err, integ sin(%.3g)", x);
  126.     gsl_test_factor(fabs(r-(-1-cos(x))) + GSL_DBL_EPSILON, e, 10.0, 
  127.                     "gsl_cheb_eval_err, integ error sin(%.3g)", x);
  128.   }
  129. #endif
  130.  
  131.   for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
  132.     double r = gsl_cheb_eval_n(csi, 25, x);
  133.     gsl_test_abs(r, -(1+cos(x)), tol, "gsl_cheb_eval_n, integ sin(%.3g)", x);
  134.   }
  135.  
  136. #ifdef TEST_INTEGRAL_ERR
  137.   for(x=-M_PI; x<M_PI; x += M_PI/100.0) {
  138.     double r, e;
  139.     gsl_cheb_eval_n_err(csi, 25, x, &r, &e);
  140.     gsl_test_abs(r, -(1+cos(x)), 100.0 * tol, "gsl_cheb_eval_n_err, integ sin(%.3g)", x);
  141.     gsl_test_factor(fabs(r-(-1-cos(x))) + GSL_DBL_EPSILON, e, 10.0, 
  142.                     "gsl_cheb_eval_n_err, integ error sin(%.3g)", x);
  143.   }
  144. #endif
  145.  
  146.   gsl_cheb_free(csi);
  147.   gsl_cheb_free(csd);
  148.   gsl_cheb_free(cs);
  149.  
  150.   exit (gsl_test_summary());
  151. }
  152.